package inputStream;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author 培培
 * @condition 努力学习中
 *
 * FileInputStream 的使用（字节输入流，文件--> 程序）
 */
public class FileInputStream_ {
    public static void main(String[] args) {

    }

    /**
     * 读取文件
     * 单个字节读取，效率较低
     * -> 使用 read(byte[] b) 就行优化
     */
    @Test
    public void readFile01(){
        String filePath = "d:\\hello.txt";
        int readData = 0;
        FileInputStream fileInputStream = null;
        try {
            //创建FileInputStream 对象，用于读取 文件
            fileInputStream = new FileInputStream(filePath);
            //从该输入流读取一个字节的数据，如果没有输入可用，此方法将被阻止
            //如果返回-1，表示读取完毕
            while((readData = fileInputStream.read()) != -1){
                System.out.print((char) readData);//转成char显示
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭文件流，释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 使用 read(byte[] b) 就行优化
     */
    @Test
    public void readFile02(){
        String filePath = "d:\\hello.txt";

        //首先定义一个字节数组
        byte[] buf = new byte[8]; //一次性读取8个字节
        int readLength = 0;

        FileInputStream fileInputStream = null;
        try {
            //创建FileInputStream 对象，用于读取 文件
            fileInputStream = new FileInputStream(filePath);
            //从该输入流读取最多b.length字节的数据到字节数组。如果没有输入可用，此方法将被阻止
            //如果返回-1，表示读取完毕
            //如果读取正常，返回实际读取的字节数
            while((readLength = fileInputStream.read(buf)) != -1){
                System.out.print(new String(buf,0,readLength));//显示
            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭文件流，释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
